package pe.com.pgn.consolidadorventas.servidorcentral.web;

import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import pe.com.pgn.consolidadorventas.servidorcentral.dbo.Archivo;
import pe.com.pgn.consolidadorventas.servidorcentral.service.EstacionService;
import pe.com.pgn.consolidadorventas.servidorcentral.service.ProcedureService;
import pe.com.pgn.consolidadorventas.servidorcentral.service.ServidorCentralService;
import pe.com.pgn.consolidadorventas.servidorcentral.util.Constantes;
import pe.com.pgn.consolidadorventas.servidorcentral.util.FechasUtil;
import pe.com.pgn.consolidadorventas.servidorcentral.util.LoggerUtil;
import pe.com.pgn.consolidadorventas.servidorcentral.web.domain.EstacionEstadoEjecucion;

@Controller(value="enviosController")
public class EnviosController {
		
	static Logger logger = Logger.getLogger(EnviosController.class);

	@Autowired
	@Qualifier("servidorCentralServiceImpl")
	ServidorCentralService servidorCentralService;
	
	@Autowired
	@Qualifier("procedureServiceImpl")
	ProcedureService procedureService;
	
	@Autowired
	@Qualifier("estacionServiceImpl")
	EstacionService estacionService;
	
	String vista;
	
	public EnviosController(){
		vista = "consultaEnvios";
	}
	
	@RequestMapping(value="/consultaEnvios.php")
	public ModelAndView consultarEstadoEnvios(HttpServletRequest request, HttpServletResponse response){
		ModelAndView model = new ModelAndView(vista);
		
		String fechaInicio = request.getParameter("fechaInicio");
		String fechaFin = request.getParameter("fechaFin");
		Date fecInicio = null;
		Date fecFin = null;

		if(fechaInicio==null && fechaFin==null){
			//Debemos traer los ultimos 7 dias
			Calendar c = Calendar.getInstance();
			fecFin = c.getTime();
			fechaFin = FechasUtil.formatearDateToString(fecFin);
			
			//Debemos al iniciar por defecto muestra desde dia actual a 7 dias antes
			c.add(Calendar.DATE, -7);
			fecInicio = c.getTime();
			fechaInicio = FechasUtil.formatearDateToString(fecInicio);

		}else{
			//Debemos traer desde las fechas indicadas
			fecInicio = FechasUtil.formatearStringToDate(fechaInicio);
			fecFin = FechasUtil.formatearStringToDate(fechaFin);	
		}
		
		//Obtenemos las ejecuciones de cada estacion para el intervalo de dias
		List<EstacionEstadoEjecucion> listaEjecuciones = (List<EstacionEstadoEjecucion>)estacionService.obtenerEstacionesConEstadoConsulta(fecInicio,fecFin);
		//Seteamos los datos
		model.addObject("listaEstacionesEstado",listaEjecuciones);
		
		//Seteamos las fechas
		model.addObject("fechaInicio",fechaInicio);
		model.addObject("fechaFin",fechaFin);
		
		return model;
	}
	
	@RequestMapping(value="/regenerarEnvio.php")
	public ModelAndView regenerarEnvio(HttpServletRequest request, HttpServletResponse response){
		ModelAndView model = new ModelAndView("regenerarEnvio");
		String idFila = request.getParameter("idFila");
		String idEstacion = request.getParameter("idEstacion");
		String fecha = request.getParameter("fecha");
		String tipoVenta = request.getParameter("tipoVenta");
		String numeroRegistros = request.getParameter("numeroRegistros");
		String numeroRegistrosGlp = request.getParameter("numeroRegistrosGlp");
		String numeroRegistrosGnv = request.getParameter("numeroRegistrosGnv");

		int fila = -1;
		int id = -1;
		int tipoCombustible = -1; 
		int numFilas = -1;
		int numFilasGlp = -1;
		int numFilasGnv = -1;
		String tipoFichero = "";
		String mensajeError = "";
		
		EstacionEstadoEjecucion nuevoEstado = null;
		
		if(idEstacion!=null && fecha!=null && tipoVenta!=null){
			
			try{
				fila = Integer.parseInt(idFila);
				id = Integer.parseInt(idEstacion);
				tipoCombustible = Integer.parseInt(tipoVenta);
				numFilas = Integer.parseInt(numeroRegistros);
				numFilasGlp = Integer.parseInt(numeroRegistrosGlp);
				numFilasGnv = Integer.parseInt(numeroRegistrosGnv);
					
				try{
					servidorCentralService.regenerarInformacionVentas(id,fecha,tipoCombustible);

					//Una vez terminada la regeneracion , si es GNV se debe de llamar al procedure
					if(tipoCombustible == Constantes.TIPO_VENTA_GNV){
						procedureService.ejecutarProcedureEstadisticasEds(id,fecha);
					}
					
				}catch(Exception exd){
					
					if(tipoCombustible==0){
						tipoFichero = "GLP";
					}else{
						tipoFichero = "GNV";
					}
					mensajeError = "El fichero de "+tipoFichero+" para la fecha "+fecha+" tiene datos fuera del estandar establecido";
					LoggerUtil.error(logger,mensajeError+" : "+exd.getLocalizedMessage());
				}
				
				nuevoEstado = estacionService.obtenerEjecucionEstacionDia(id,fecha,tipoCombustible);
				
				if(nuevoEstado.getEstado()==null){
					
					//Fix momentaneo hasta que este completo el reenvio de gnv
					Archivo x = new Archivo();
					x.setFecha(FechasUtil.formatearStringToDate(fecha));
					x.setFechaRegistro(fecha);
					
					if(mensajeError.equals("")){
						x.setTipoCarga(-1);
						x.setDescripcionCarga("No hay ejecucion para este dia");
					}else{
						x.setTipoCarga(0);
						x.setDescripcionCarga(mensajeError);
					}
					
					nuevoEstado.setEstado(x);
					
				}
				nuevoEstado.setTipoVentaRegistro(tipoCombustible);
				
				if(tipoCombustible==Constantes.TIPO_VENTA_GLP){
					nuevoEstado.setGrupoDeVentas("GLP");
				}
				
				if(tipoCombustible==Constantes.TIPO_VENTA_GNV){
					nuevoEstado.setGrupoDeVentas("GNV");
				}
				
				nuevoEstado.setNumeroRegistros(numFilas);
				nuevoEstado.setNumeroRegistrosGlp(numFilasGlp);
				nuevoEstado.setNumeroRegistrosGnv(numFilasGnv);
				
				
				model.addObject("nuevoEstado", nuevoEstado);

			}catch(NumberFormatException nfe){
				LoggerUtil.error(logger,nfe.getMessage());
			}
		}
		
		model.addObject("idFila",fila);							
		
		return model;
	}

}
